package com.heima.article.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.article.dtos.ArticleCommentDto;
import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.article.dtos.ArticleHomeDto;
import com.heima.model.article.dtos.ArticleInfoDto;
import com.heima.model.article.pojos.ApArticle;
import com.heima.model.article.vos.ArticleCommnetVo;
import com.heima.model.article.vos.HotArticleVo;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.vos.PageResultVo;
import com.heima.model.mess.ArticleVisitStreamMess;
import com.heima.model.wemedia.dtos.StatisticsDto;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 文章信息表，存储已发布的文章 服务类
 * </p>
 *
 * @author lin
 * @since 2025-06-10
 */
public interface IApArticleService extends IService<ApArticle> {
    /**
     * 根据参数加载文章列表
     *
     * @param dto 参数
     * @param loadType 1为加载更多  2为加载最新
     */
    ResponseResult<List<HotArticleVo>> load(Short loadType, ArticleHomeDto dto);

    /**
     * 加载文章列表
     *
     * @param dto       参数
     * @param type      1 加载更多   2 加载最新
     * @param firstPage true 是首页  false 非首页
     */
    ResponseResult<List<HotArticleVo>> load2(Short type, ArticleHomeDto dto, boolean firstPage);

    /**
     * 上传数据库中指定文章到minio
     *
     * @param articleId 文章id
     */
    void upload(Integer articleId);

    /**
     * 保存文章
     *
     * @param dto 文章数据
     */
    ResponseResult<Long> saveArticle(ArticleDto dto);

    /**
     * 删除文章中引用的图片
     *
     * @param imgUrl 图片Id
     */
    ResponseResult<String> markImageAsDeleted(String imgUrl) throws JsonProcessingException;

    /**
     * 删除文章
     *
     * @param id 文章id
     */
    void delArticleById(Long id);

    /**
     * 加载文章详情 数据回显
     */
    ResponseResult<Map<String, Object>> loadArticleBehavior(ArticleInfoDto dto);

    /**
     * 更新文章的分值  同时更新缓存中的热点文章数据
     * @param mess 文章更新信息
     */
    void updateScore(ArticleVisitStreamMess mess);

    /**
     * 图文统计
     */
    ResponseResult<Map<String, Object>> queryLikesAndConllections(Integer wmUserId, Date beginDate, Date endDate);

    /**
     * 分页查询 图文统计
     */
    PageResultVo<ApArticle> newPage(StatisticsDto dto);

    /**
     * 查询文章评论统计
     */
    PageResponseResult<List<ArticleCommnetVo>> findNewsComments(ArticleCommentDto dto);
}
